home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 501-525 / disk_510 / atcopy / pc / pccopy.pas < prev    next >
Pascal/Delphi Source File  |  1992-05-06  |  5KB  |  231 lines

  1. program pccopy;
  2.  
  3. (*$M 1024, 0, 0 *)
  4. (* Mit $M das Programm speicherresident machen *)
  5. (*$I- *)
  6. (* Durch $I- abschalten der Laufzeitfehler ! *)
  7.  
  8. (* Version 2.2 13.01.91 *)
  9.  
  10. uses dos;
  11.  
  12. var
  13.     flag0,data0,flag,data,name,dprs : word;
  14.     numbuf   : byte;
  15.     len,i,j  : word;
  16.     test     : real;
  17.     vari     : byte;
  18.     fh       : file;
  19.     text     : PathStr;
  20.     DIR      : DirStr;
  21.     oldDIR   : DirStr;
  22.     NAME2    : NameStr;
  23.     EXT      : ExtStr;
  24.     textp    : ^string;
  25.  
  26.  
  27. procedure both;
  28. begin
  29.    text  := 'ATCopy2.1';
  30. (* Mit diesem Text ermittle ich die Startaddresse meines Buffers. *)
  31.    data0 := 0;
  32.    for i := 0 to 10000 do
  33.    begin
  34. (* Wenn diese nicht innerhalb der ersten 10000 Bytes liegt => Fehler *)
  35.       textp := ptr(dprs,i);
  36.       if textp^ = text then
  37.       begin
  38.          flag0 := i;
  39.          data0 := flag0 + 24;
  40. (* Es werden 24 Buffer verwendet. Siehe Amiga *)
  41. (* Dies ist mein ERSTES Pascal Programm. Es gibt bestimmt bessere Methoden
  42.    die Schleife abzubrechen, aber es geht ja auch so. *)
  43.          i := 10000;
  44.       end;
  45.    end;
  46.    if data0 = 0 then
  47.    begin
  48.       writeln('Start flag not found !');
  49.       writeln('Program aborted.');
  50.       exit;
  51.    end;
  52.  
  53. (* Per MEM[a:b] ist ein direkter Speicherzugriff auf die Addresse a:b möglich *)
  54.  
  55.    MEM[dprs:flag0] := 0;
  56.  
  57.    flag := flag0;
  58.    data := data0;
  59.  
  60. (* $10 bedeutet neuer Filename, $50 bedeutet Fehler *)
  61.  
  62.    repeat
  63.       while MEM[dprs:flag] <> $10 do
  64.       begin
  65.          if MEM[dprs:flag] = $50 then
  66.          begin
  67.             MEM[dprs:flag] := 0;
  68.             writeln('Regular exit !');
  69.             exit;
  70.          end;
  71.       end;
  72.  
  73. (* Übertragen des Dateinamens. Längenangabe plus Text PASCAL-Format *)
  74.  
  75.       len := MEM[dprs:data];
  76.       text[0] := char(0);
  77.       for i:= 1 to len do
  78.       begin
  79.          text[i] := char(MEM[dprs:data + i]);
  80.       end;
  81.       text[0] := char(len);
  82.  
  83. (* Datei öffnen *)
  84.  
  85.       FSplit(text,DIR,NAME2,EXT);
  86.       if DIR[0] > char(3) then
  87.          dec(DIR[0]);
  88.  
  89. (* Prüfen, ob das Directory existiert und ggf. erzeugen. *)
  90.  
  91.       if DIR[2] = char(42) then (* 42 = : *)
  92.       begin
  93.          i := word(DIR[1]);
  94.          j := DiskFree(i-65);
  95.          if j = -1 then
  96.          begin
  97.             writeln ('ERROR: wrong path.');
  98. (* Ungültiges Laufwerk *)
  99.             exit;
  100.          end;
  101.          if j = 0 then
  102.          begin
  103.             writeln('ERROR: disk is full.');
  104.             exit;
  105.          end;
  106.       end;
  107.       GetDir(0,oldDIR);
  108.       ChDir(DIR);
  109.       DOSError := IOResult;
  110.       if DOSError = 3 then
  111.       begin
  112.          MkDir(DIR);
  113.          DOSError := IOResult;
  114.          if DOSError = 3 then
  115.          begin
  116.             writeln('ERROR: disk is write protect.');
  117.             exit;
  118.          end;
  119.       end;
  120.       ChDir(oldDIR);
  121.       DOSError := IOResult;
  122.       MEM[dprs:flag] := 0;
  123.  
  124.       assign(fh,text);
  125.       rewrite(fh,1);
  126.       DOSError := IOResult;
  127.  
  128. (* Nächsten der 24 Buffer überprüfen *)
  129.  
  130.       inc(flag);
  131.       inc(data,$82);
  132.       if flag = data0 then
  133.       begin
  134.          flag := flag0;
  135.          data := data0;
  136.       end;
  137.  
  138. (* $20 => DatenBlock (nicht letzter) , $30 letzter DatenBlock *)
  139.  
  140.       repeat
  141.          while (( MEM[dprs:flag] <> $20 ) and ( MEM[dprs:flag] <> $30 ) and ( MEM[dprs:flag] <> $50 )) do ;
  142.  
  143. (* Diese Schleife ist notwendig, da ich nicht ausschliessen kann, daß beide Rechner
  144.    gleichzeitig ? auf das Dual-Ported-RAM zugreifen. Wenn dies der Fall ist, sind
  145.    die Werte die abgelegt werden nicht eindeutig. Es kam zu recht merkwürdigen Effekten *)
  146.  
  147.          if MEM[dprs:flag] = $50 then
  148.          begin
  149.             MEM[dprs:flag] := 0;
  150.             writeln('Expecting more data !');
  151.             writeln('Please check the files.');
  152.             close(fh);
  153.             exit;
  154.          end;
  155.          if MEM[dprs:flag] = $20 then
  156.          begin
  157.  
  158. (* Protokoll der DatenBlöcke:
  159.  
  160.    Anzahl der Bytes im Block gefolgt von den Daten *)
  161.  
  162.             i := MEM[dprs:data];
  163.             inc(data);
  164.             blockwrite(fh,MEM[dprs:data],i,j);
  165.             if j <> i then
  166.             begin
  167.                writeln('ERROR: disk is full.');
  168.                close(fh);
  169.                exit;
  170.             end;
  171.             MEM[dprs:flag] := 0;
  172.             inc(flag);
  173.             inc(data,$81);
  174.             if flag = data0 then
  175.             begin
  176.                flag := flag0;
  177.                data := data0;
  178.             end;
  179.          end;
  180.       until MEM[dprs:flag] = $30;
  181.       i := MEM[dprs:data];
  182.       inc(data);
  183.       blockwrite(fh,MEM[dprs:data],i,j);
  184.       if j <> i then
  185.       begin
  186.          writeln('ERROR: disk is full.');
  187.          close(fh);
  188.          exit;
  189.       end;
  190.       MEM[dprs:flag] := 0;
  191.       inc(flag);
  192.       inc(data,$81);
  193.       if flag = data0 then
  194.       begin
  195.          flag := flag0;
  196.          data := data0;
  197.       end;
  198.       close(fh);
  199.    until false;
  200. end;
  201.  
  202.  
  203. procedure at;
  204. interrupt;
  205. begin
  206.      dprs := $d000; (* Addresse des Dual-Ported-RAM's PARAMETER Buffer *)
  207. (* Diese Addresse stammt aus dem Buch 'Amiga SYSTEM-Handbuch' von M&T.
  208.  
  209.    Auch in diesem Buch habe ich einiges über die Janus.library gefunden.
  210.    Insbesondere die Addressen der Buffer. *)
  211.  
  212.      both;
  213. end;
  214.  
  215. procedure xt;
  216. interrupt;
  217. begin
  218.      dprs := $f000; (* s.o. Aber für XT bzw. SideCar *)
  219.      both;
  220. end;
  221.  
  222. (* Mit diesem Trick mache ich das Programm speicherresident. Die Interrupts
  223.    werden von den Programmen XT.exe bzw. AT.exe ausgelöst. Daher wohl auch
  224.    der DeadEND wenn AT.exe alleine aufgerufen wird. *)
  225.  
  226. begin
  227.      SetIntVec(66,@at);
  228.      SetIntVec(67,@xt);
  229.      keep(0);
  230. end.
  231.